package main

import (
	"fmt"
	"log"
	"os"

	"gorm.io/driver/mysql"
	"gorm.io/gen"
	"gorm.io/gorm"
)

func main() {
	// 数据库连接配置
	dsn := getDSN()

	// 连接数据库
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		log.Fatalf("连接数据库失败: %v", err)
	}

	fmt.Println("✅ 数据库连接成功")

	// 创建生成器
	g := gen.NewGenerator(gen.Config{
		OutPath:       "./model/db_model", // 输出路径
		OutFile:       "query.go",         // 查询文件名
		ModelPkgPath:  "model/db_model",   // 生成的模型包路径
		WithUnitTest:  false,              // 不生成单元测试
		FieldNullable: true,               // 字段可为空
	})

	// 使用数据库
	g.UseDB(db)

	// 生成所有表的模型
	g.ApplyBasic(
		// 自动发现并生成所有表
		g.GenerateAllTable()...,
	)

	// 执行生成
	g.Execute()

	fmt.Println("🎉 代码生成完成！")
	fmt.Println("📁 生成的文件位于: ./model/db_model/")
}

// 获取数据库连接字符串
func getDSN() string {
	// 从环境变量获取配置，如果没有则使用默认值
	host := getEnv("DB_HOST", "localhost")
	port := getEnv("DB_PORT", "3306")
	user := getEnv("DB_USER", "root")
	password := getEnv("DB_PASSWORD", "123456")
	database := getEnv("DB_NAME", "gofilm")

	dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local",
		user, password, host, port, database)

	fmt.Printf("🔗 连接数据库: %s@%s:%s/%s\n", user, host, port, database)
	return dsn
}

// 获取环境变量，如果不存在则返回默认值
func getEnv(key, defaultValue string) string {
	if value := os.Getenv(key); value != "" {
		return value
	}
	return defaultValue
}
